<?php
/**
 * 查询文档的高级用法
 * https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/
 * Created by PhpStorm.
 * User: bimUser
 * Date: 2018/1/20
 * Time: 17:07
 */

require 'config.php';
require 'vendor/autoload.php';

// 实例化连接
$db = new MongoDB\Client("mongodb://{$cnf['USERNAME']}:{$cnf['PASSWD']}@{$cnf['HOST']}:{$cnf['PORT']}/{$cnf['DBNAME']}");
$db = $db->stock;

// 默认情况下，MongoDB中的查询返回匹配文档中的所有字段。为了限制MongoDB发送给应用程序的数据量，可以包含投影文档来指定或限制要返回的字段。
// 本页面提供了使用MongoDB PHP库中的MongoDB\Collection::find() 方法 进行投影的查询操作示例 。
// 本页上的示例使用该集合。要填充集合，请运行inventory.php


// 返回匹配文档中的所有字段¶
// 如果您不指定投影文档，则该 find() 方法会返回匹配文档中的所有字段。
// 以下示例将返回inventory集合中status等于所有文档的所有字段 "A"：
$cursor = $db->inventory->find(['status' => 'A']);
// 该操作对应于以下SQL语句：
// SELECT * from inventory WHERE status = "A"


// 返回指定字段，该_id字段只
// 投影可以通过在投影文档中设置<field>to 来显式包含几个字段 1。以下操作将返回与查询匹配的所有文档。
// 在结果集中，只有item，status并且在默认情况下，该_id场返回匹配的文档。
$cursor = $db->inventory->find(
    ['status' => 'A'],
    ['projection' => ['item' => 1, 'status' => 1]]
);
// 该操作对应于以下SQL语句：
// SELECT _id, item, status from inventory WHERE status = "A"


// 排除_id
// 您可以删除_id其排除设置从结果现场<field>来0在投影，如下面的例子：
$cursor = $db->inventory->find(
    ['status' => 'A'],
    ['projection' => ['item' => 1, 'status' => 1, '_id' => 0]]
);
// 该操作对应于以下SQL语句：
// SELECT item, status from inventory WHERE status = "A"


// 返回所有但不包含的字段
// 您可以使用投影来排除特定字段，而不是列出要在匹配文档中返回的字段。
// 下面的例子返回除了status和instock 外，并与查询条件匹配的其他字段：
$cursor = $db->inventory->find(
    ['status' => 'A'],
    ['projection' => ['status' => 0, 'instock' => 0]]
);


// 下面的例子演示返回一个子节点的内容，size.uom
$cursor = $db->inventory->find(
    ['status' => 'A'],
    ['projection' => ['item' => 1, 'status' => 1, 'size.uom' => 1]]
);


// 下面的例子演示返回除一个子节点size.uom外的字段
$cursor = $db->inventory->find(
    ['status' => 'A'],
    ['projection' => ['size.uom' => 0]]
);


// 返回数组中的项目特定数组元素
// 对于包含阵列的字段，MongoDB的提供了如下的投影算子用来操作数组：$elemMatch， $slice，和$。
// 以下示例使用$slice投影运算符来返回instock数组中的最后一个元素：
$cursor = $db->inventory->find(
    ['status' => 'A'],
    ['projection' => ['item' => 1, 'status' => 1, 'instock' => ['$slice' => -1]]]
);


// 位置$运算符<array>将查询结果中的内容限制为 只包含与查询文档匹配的第一个元素。
// https://docs.mongodb.com/manual/reference/operator/projection/positional/#proj._S_


// $slice操作员控制该查询返回的数组的项数。返回数组中的前几个或后几个元素
// https://docs.mongodb.com/manual/reference/operator/projection/slice/#proj._S_slice


// $elemMatch操作者的限制的内容 <array>从查询结果字段只包含第一 匹配元件$elemMatch的条件。
// https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/#proj._S_elemMatch


// 比较查询 https://docs.mongodb.com/manual/reference/operator/query-comparison/
$collect = "BUY_SELL_t1";
$collection = $db->$collect;
$doc = $collection->findOne(['total' => ['$gt' => 9.1]]); // total > 9.1
//var_dump($doc);


// 排序查询结果 https://docs.mongodb.com/php-library/current/tutorial/crud/#limit-sort-and-skip-options
$collect = "BUY_SELL_SH_600008";
$collection = $db->$collect;
$cursor = $collection->find(
    ['total' => ['$gt' => 3.6]],
    [
        'limit' => 5, // 限制结果文档数量
        'sort' => ['total' => -1], // 要排序的字段，1为顺序，-1为倒序
    ]
);

$result = array();

foreach ($cursor as $document) {
    $k = '';
    $temp = array();
    foreach ($document as $key => $value) {
        if (!$k && $key == '_id') { // 取外层的_id
            $k = $value;
        }
        if (!is_object($value) && $key != '_id') {
            $temp[$key] = $value;
        }
    }
    $result[$k] = $temp;
}

